home *** CD-ROM | disk | FTP | other *** search
/ Ray Dream Studio 5 / Ray Dream.iso / pc / DreamSDK / Windows / INCLUDES / RCOMPOBJ.H < prev    next >
Encoding:
C/C++ Source or Header  |  1997-07-11  |  32.0 KB  |  998 lines

  1. /* $Id: RCOMPOBJ.H 1.23 1997/02/19 04:17:04 john Exp $ */
  2.  
  3. /*****************************************************************************\
  4. *                                                                             *
  5. * compobj.h -     Component object model definitions                              *
  6. *                                                                             *
  7. *               OLE Version 2.0                                               *
  8. *                                                                             *
  9. *               Copyright (c) 1992-1993, Microsoft Corp. All rights reserved. *
  10. *                                                                             *
  11. \*****************************************************************************/
  12.  
  13. #ifdef psqpsq
  14.  
  15. #ifndef _OBJBASE_H_
  16. #include "objbase.h"
  17. #endif
  18.  
  19. #else
  20. #if !defined( _COMPOBJ_H_ ) && !defined( _OBJBASE_H_ )
  21.  
  22. #define _COMPOBJ_H_
  23. #define _OBJBASE_H_
  24.  
  25. /****** Linkage Definitions *************************************************/
  26.  
  27. /*
  28.  *      These are macros for declaring methods/functions.  They exist so that
  29.  *      control over the use of keywords (CDECL, PASCAL, __export,
  30.  *      extern "C") resides in one place, and because this is the least
  31.  *      intrusive way of writing function declarations that do not have
  32.  *      to be modified in order to port to the Mac.
  33.  *
  34.  *      The macros without the trailing underscore are for functions/methods
  35.  *      which a return value of type HRESULT; this is by far the most common
  36.  *      case in OLE. The macros with a trailing underscore take a return
  37.  *      type as a parameter.
  38.  *
  39.  * WARNING: STDAPI is hard coded into the LPFNGETCLASSOBJECT typedef below.
  40.  */
  41.  
  42. #ifdef __cplusplus
  43.     #define EXTERN_C    extern "C"
  44. #else
  45.     #define EXTERN_C    extern
  46. #endif
  47.  
  48. #ifdef _MAC
  49. #if !defined(_MSMAC) && !defined(__cdecl)
  50. #define __cdecl
  51. #endif
  52. #ifndef STDMETHODCALLTYPE
  53. #define STDMETHODCALLTYPE __cdecl
  54. #endif
  55. #define STDAPICALLTYPE __cdecl
  56. #define STDAPI                  EXTERN_C HRESULT STDAPICALLTYPE
  57. #define STDAPI_(type)           EXTERN_C type STDAPICALLTYPE
  58.  
  59. #define FAR
  60.  
  61. #else   //  !_MAC
  62.  
  63. #ifdef WIN32
  64. //#define STDMETHODCALLTYPE       __cdecl
  65. //#define STDAPICALLTYPE          __stdcall
  66. #define STDMETHODCALLTYPE       __stdcall
  67. #define STDMETHODVCALLTYPE      __cdecl
  68.  
  69. #define STDAPICALLTYPE          __stdcall
  70. #define STDAPIVCALLTYPE         __cdecl
  71.  
  72. #define STDAPI                  EXTERN_C HRESULT STDAPICALLTYPE
  73. #define STDAPI_(type)           EXTERN_C type STDAPICALLTYPE
  74.  
  75. #else
  76.     #ifdef _3DSHELL
  77.         #define STDMETHODCALLTYPE       __loadds FAR CDECL
  78.         #define STDAPICALLTYPE          __loadds FAR PASCAL
  79.     #else
  80.         #define STDMETHODCALLTYPE       __export FAR CDECL
  81.         #define STDAPICALLTYPE          __export FAR PASCAL
  82.     #endif
  83.  
  84. #define STDAPI                  EXTERN_C HRESULT STDAPICALLTYPE
  85. #define STDAPI_(type)           EXTERN_C type STDAPICALLTYPE
  86.  
  87. #endif
  88.  
  89. #endif //!_MAC
  90.  
  91. #ifndef STDMETHODIMP
  92.     #define STDMETHODIMP            HRESULT STDMETHODCALLTYPE
  93.     #define STDMETHODIMP_(type)     type STDMETHODCALLTYPE
  94. #endif
  95.  
  96. /****** Interface Declaration ***********************************************/
  97.  
  98. /*
  99.  *      These are macros for declaring interfaces.  They exist so that
  100.  *      a single definition of the interface is simulataneously a proper
  101.  *      declaration of the interface structures (C++ abstract classes)
  102.  *      for both C and C++.
  103.  *
  104.  *      DECLARE_INTERFACE(iface) is used to declare an interface that does
  105.  *      not derive from a base interface.
  106.  *      DECLARE_INTERFACE_(iface, baseiface) is used to declare an interface
  107.  *      that does derive from a base interface.
  108.  *
  109.  *      By default if the source file has a .c extension the C version of
  110.  *      the interface declaratations will be expanded; if it has a .cpp
  111.  *      extension the C++ version will be expanded. if you want to force
  112.  *      the C version expansion even though the source file has a .cpp
  113.  *      extension, then define the macro "CINTERFACE".
  114.  *      eg.     cl -DCINTERFACE file.cpp
  115.  *
  116.  *      Example Interface declaration:
  117.  *
  118.  *          #undef  INTERFACE
  119.  *          #define INTERFACE   IClassFactory
  120.  *
  121.  *          DECLARE_INTERFACE_(IClassFactory, IUnknown)
  122.  *          {
  123.  *              // *** IUnknown methods ***
  124.  *              STDMETHOD(QueryInterface) (THIS_
  125.  *                                        REFIID riid,
  126.  *                                        LPVOID FAR* ppvObj) PURE;
  127.  *              STDMETHOD_(ULONG,AddRef) (THIS) PURE;
  128.  *              STDMETHOD_(ULONG,Release) (THIS) PURE;
  129.  *
  130.  *              // *** IClassFactory methods ***
  131.  *              STDMETHOD(CreateInstance) (THIS_
  132.  *                                        LPUNKNOWN pUnkOuter,
  133.  *                                        REFIID riid,
  134.  *                                        LPVOID FAR* ppvObject) PURE;
  135.  *          };
  136.  *
  137.  *      Example C++ expansion:
  138.  *
  139.  *          struct FAR IClassFactory : public IUnknown
  140.  *          {
  141.  *              virtual HRESULT STDMETHODCALLTYPE QueryInterface(
  142.  *                                                  IID FAR& riid,
  143.  *                                                  LPVOID FAR* ppvObj) = 0;
  144.  *              virtual HRESULT STDMETHODCALLTYPE AddRef(void) = 0;
  145.  *              virtual HRESULT STDMETHODCALLTYPE Release(void) = 0;
  146.  *              virtual HRESULT STDMETHODCALLTYPE CreateInstance(
  147.  *                                              LPUNKNOWN pUnkOuter,
  148.  *                                              IID FAR& riid,
  149.  *                                              LPVOID FAR* ppvObject) = 0;
  150.  *          };
  151.  *
  152.  *          NOTE: Our documentation says '#define interface class' but we use
  153.  *          'struct' instead of 'class' to keep a lot of 'public:' lines
  154.  *          out of the interfaces.  The 'FAR' forces the 'this' pointers to
  155.  *          be far, which is what we need.
  156.  *
  157.  *      Example C expansion:
  158.  *
  159.  *          typedef struct IClassFactory
  160.  *          {
  161.  *              const struct IClassFactoryVtbl FAR* lpVtbl;
  162.  *          } IClassFactory;
  163.  *
  164.  *          typedef struct IClassFactoryVtbl IClassFactoryVtbl;
  165.  *
  166.  *          struct IClassFactoryVtbl
  167.  *          {
  168.  *              HRESULT (STDMETHODCALLTYPE * QueryInterface) (
  169.  *                                                  IClassFactory FAR* This,
  170.  *                                                  IID FAR* riid,
  171.  *                                                  LPVOID FAR* ppvObj) ;
  172.  *              HRESULT (STDMETHODCALLTYPE * AddRef) (IClassFactory FAR* This) ;
  173.  *              HRESULT (STDMETHODCALLTYPE * Release) (IClassFactory FAR* This) ;
  174.  *              HRESULT (STDMETHODCALLTYPE * CreateInstance) (
  175.  *                                                  IClassFactory FAR* This,
  176.  *                                                  LPUNKNOWN pUnkOuter,
  177.  *                                                  IID FAR* riid,
  178.  *                                                  LPVOID FAR* ppvObject);
  179.  *              HRESULT (STDMETHODCALLTYPE * LockServer) (
  180.  *                                                  IClassFactory FAR* This,
  181.  *                                                  BOOL fLock);
  182.  *          };
  183.  */
  184.  
  185.  
  186. #if defined(__cplusplus) && !defined(CINTERFACE)
  187. #ifdef __TURBOC__
  188. #define interface               struct huge
  189. #else
  190. #define interface               struct FAR
  191. #endif
  192. #ifndef STDMETHOD
  193.     #define STDMETHOD(method)       virtual HRESULT STDMETHODCALLTYPE method
  194.     #define STDMETHOD_(type,method) virtual type STDMETHODCALLTYPE method
  195. #endif
  196. #ifndef PURE
  197.     #define PURE                    = 0
  198. #endif
  199. #ifndef THIS_
  200.     #define THIS_
  201. #endif
  202. #ifndef THIS
  203.     #define THIS                    void
  204. #endif
  205. #define DECLARE_INTERFACE(iface)    interface iface
  206. #define DECLARE_INTERFACE_(iface, baseiface)    interface iface : public baseiface
  207.  
  208. #else
  209. #define interface               struct
  210.  
  211. #ifdef _MAC
  212.  
  213. #define STDMETHOD(method)       long    method##pad;\
  214.                                 HRESULT (STDMETHODCALLTYPE * method)
  215. #define STDMETHOD_(type,method) long    method##pad;\
  216.                                 type (STDMETHODCALLTYPE * method)
  217.  
  218. #else // _MAC
  219.  
  220. #define STDMETHOD(method)       HRESULT (STDMETHODCALLTYPE * method)
  221. #define STDMETHOD_(type,method) type (STDMETHODCALLTYPE * method)
  222.  
  223. #endif // !_MAC
  224.  
  225. #define PURE
  226. #define THIS_                   INTERFACE FAR* This,
  227. #define THIS                    INTERFACE FAR* This
  228. #ifdef CONST_VTABLE
  229. #define DECLARE_INTERFACE(iface)    typedef interface iface { \
  230.                                     const struct iface##Vtbl FAR* lpVtbl; \
  231.                                 } iface; \
  232.                                 typedef const struct iface##Vtbl iface##Vtbl; \
  233.                                 const struct iface##Vtbl
  234. #else
  235. #define DECLARE_INTERFACE(iface)    typedef interface iface { \
  236.                                     struct iface##Vtbl FAR* lpVtbl; \
  237.                                 } iface; \
  238.                                 typedef struct iface##Vtbl iface##Vtbl; \
  239.                                 struct iface##Vtbl
  240. #endif
  241. #define DECLARE_INTERFACE_(iface, baseiface)    DECLARE_INTERFACE(iface)
  242.  
  243. #endif
  244.  
  245.  
  246. /****** Additional basic types **********************************************/
  247.  
  248.  
  249. #ifndef FARSTRUCT
  250. #ifdef __cplusplus
  251. #define FARSTRUCT   FAR
  252. #else
  253. #define FARSTRUCT   
  254. #endif  // __cplusplus
  255. #endif  // FARSTRUCT
  256.  
  257.  
  258. #ifndef WINAPI          /* If not included with 3.1 headers... */
  259.  
  260. #ifdef WIN32
  261.     #define FAR
  262.     #define PASCAL          __stdcall
  263.     #define CDECL
  264. #elif !defined(_MAC)
  265.     #define FAR             _far
  266.     #define PASCAL          _pascal
  267.     #define CDECL           _cdecl
  268. #endif
  269.  
  270. #ifndef VOID
  271. #define VOID void
  272. typedef char CHAR;
  273. typedef short SHORT;
  274. typedef long LONG;
  275. #endif
  276. #define WINAPI      FAR PASCAL
  277. #define CALLBACK    FAR PASCAL
  278.  
  279. #ifndef FALSE
  280. #define FALSE 0
  281. #define TRUE 1
  282. #endif
  283.  
  284. typedef int BOOL;
  285. typedef unsigned char BYTE;
  286. typedef unsigned short WORD;
  287. typedef unsigned int UINT;
  288.  
  289. typedef unsigned long DWORD;
  290.  
  291. typedef LONG *PLONG;    
  292. typedef void *PVOID;    
  293.  
  294. typedef UINT WPARAM;
  295. typedef LONG LPARAM;
  296. typedef LONG LRESULT;
  297.  
  298. typedef PVOID HANDLE;
  299. //typedef unsigned int HANDLE;
  300. #define DECLARE_HANDLE(name)    typedef HANDLE name
  301.  
  302. DECLARE_HANDLE(HMODULE);
  303. DECLARE_HANDLE(HINSTANCE);
  304. DECLARE_HANDLE(HLOCAL);
  305. DECLARE_HANDLE(HGLOBAL);
  306. DECLARE_HANDLE(HDC);
  307. DECLARE_HANDLE(HRGN);
  308. DECLARE_HANDLE(HWND);
  309. DECLARE_HANDLE(HMENU);
  310. DECLARE_HANDLE(HACCEL);
  311. DECLARE_HANDLE(HTASK);
  312.  
  313. #ifndef NULL
  314. #define NULL 0
  315. #endif
  316.  
  317.  
  318. typedef void FAR *      LPVOID;
  319. typedef WORD FAR *      LPWORD;
  320. typedef DWORD FAR *     LPDWORD;
  321. typedef char FAR*       LPSTR;
  322. typedef const char FAR* LPCSTR;
  323. //typedef void FAR*       LPLOGPALETTE;
  324. //typedef void FAR*       LPMSG;
  325. //typedef struct tagMSG FAR *LPMSG;
  326.  
  327. typedef HANDLE FAR *LPHANDLE;
  328. typedef struct tagRECT FAR *LPRECT;
  329.  
  330. typedef struct tagSIZE
  331. {
  332.     LONG        cx;
  333.     LONG        cy;
  334. } SIZE, *PSIZE, *LPSIZE;
  335. #endif  /* WINAPI */
  336.  
  337.  
  338. typedef short SHORT;
  339. typedef unsigned short USHORT;
  340. typedef DWORD ULONG;
  341.  
  342.  
  343. #ifndef HUGEP
  344. #ifdef WIN32
  345. #define HUGEP
  346. #else
  347. #define HUGEP __huge
  348. #endif // WIN32
  349. #endif // HUGEP
  350.  
  351. typedef WORD WCHAR;
  352.  
  353. #ifndef WIN32
  354. typedef struct FARSTRUCT _LARGE_INTEGER {
  355.     DWORD LowPart;
  356.     LONG  HighPart;
  357. } LARGE_INTEGER, *PLARGE_INTEGER;
  358. #endif
  359. #define LISet32(li, v) ((li).HighPart = ((LONG)(v)) < 0 ? -1 : 0, (li).LowPart = (v))
  360.  
  361. #ifndef WIN32
  362. typedef struct FARSTRUCT _ULARGE_INTEGER {
  363.     DWORD LowPart;
  364.     DWORD HighPart;
  365. } ULARGE_INTEGER, *PULARGE_INTEGER;
  366. #endif
  367. #define ULISet32(li, v) ((li).HighPart = 0, (li).LowPart = (v))
  368.  
  369. #ifndef _WINDOWS_
  370. #ifndef _FILETIME_
  371. #define _FILETIME_
  372. typedef struct _FILETIME {
  373.     DWORD dwLowDateTime;
  374.     DWORD dwHighDateTime;
  375. } FILETIME, *PFILETIME, *LPFILETIME;
  376. #endif
  377. #endif
  378.  
  379. #ifdef WIN32
  380. //#define HTASK DWORD
  381. DECLARE_HANDLE(HTASK);
  382. #endif
  383.  
  384. #include "Rscode.h"
  385.  
  386.  
  387. /****** Globally Unique Ids *************************************************/
  388.  
  389. #ifndef GUID_DEFINED
  390. #define GUID_DEFINED
  391. #ifdef __cplusplus
  392.  
  393. struct FAR _GUID
  394. {
  395.     DWORD Data1;
  396.     WORD  Data2;
  397.     WORD  Data3;
  398.     BYTE  Data4[8];
  399.  
  400.     BOOL operator==(const _GUID& iidOther) const {
  401.             return Data1==iidOther.Data1 
  402.                     &&    *(long *)&Data2==*(long *)&iidOther.Data2
  403.                     &&    *(long *)&Data4[0]==*(long *)&iidOther.Data4[0]
  404.                     &&    *(long *)&Data4[4]==*(long *)&iidOther.Data4[4];}
  405.  
  406.     BOOL operator!=(const _GUID& iidOther) const
  407.         { return !((*this) == iidOther); }
  408. };
  409.  
  410. typedef struct _GUID GUID;
  411. #else
  412. typedef struct _GUID
  413. {
  414.     DWORD Data1;
  415.     WORD  Data2;
  416.     WORD  Data3;
  417.     BYTE  Data4[8];
  418. } GUID;
  419. #endif
  420. #endif
  421.  
  422. typedef                GUID FAR* LPGUID;
  423.  
  424.  
  425. // macros to define byte pattern for a GUID.  
  426. //      Example: DEFINE_GUID(GUID_XXX, a, b, c, ...);
  427. //
  428. // Each dll/exe must initialize the GUIDs once.  This is done in one of
  429. // two ways.  If you are not using precompiled headers for the file(s) which
  430. // initializes the GUIDs, define INITGUID before including compobj.h.  This
  431. // is how OLE builds the initialized versions of the GUIDs which are included
  432. // in compobj.dll.
  433. //
  434. // The alternative (which some versions of the compiler don't handle properly;
  435. // they wind up with the initialized GUIDs in a data, not a text segment),
  436. // is to use a precompiled version of compobj.h and then include initguid.h 
  437. // after compobj.h followed by one or more of the guid defintion files.
  438.  
  439. #ifdef _MAC
  440. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
  441.     EXTERN_C const GUID name
  442. #else
  443. #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
  444.     EXTERN_C const GUID CDECL FAR name
  445. #endif
  446.  
  447. #ifdef INITGUID
  448. #include "Rinitgui.h"
  449. #endif
  450.  
  451. #define DEFINE_OLEGUID(name, l, w1, w2) \
  452.     DEFINE_GUID(name, l, w1, w2, 0xC0,0,0,0,0,0,0,0x46)
  453.  
  454.  
  455. // Interface ID are just a kind of GUID
  456. typedef GUID IID;
  457. typedef                IID FAR* LPIID;
  458. #define IID_NULL            GUID_NULL
  459. #define IsEqualIID(riid1, riid2) IsEqualGUID((REFGUID)riid1, (REFGUID)riid2)
  460.  
  461.  
  462. // Class ID are just a kind of GUID
  463. typedef GUID CLSID;
  464. typedef              CLSID FAR* LPCLSID;
  465. #define CLSID_NULL          GUID_NULL
  466. #define IsEqualCLSID(rclsid1, rclsid2) IsEqualGUID((REFGUID)rclsid1, (REFGUID)rclsid2)
  467.  
  468.  
  469. #if defined(__cplusplus)
  470. #ifndef _REFGUID_DEFINED
  471. #define _REFGUID_DEFINED
  472. #define REFGUID             const GUID FAR&
  473. #endif
  474. #ifndef _REFIID_DEFINED
  475. #define _REFIID_DEFINED
  476. #define REFIID              const IID FAR&
  477. #endif
  478. #ifndef _REFCLSID_DEFINED
  479. #define _REFCLSID_DEFINED
  480. #define REFCLSID            const CLSID FAR&
  481. #endif
  482. #else
  483. #ifndef _REFGUID_DEFINED
  484. #define _REFGUID_DEFINED
  485. #define REFGUID             const GUID FAR* const
  486. #endif
  487. #ifndef _REFIID_DEFINED
  488. #define _REFIID_DEFINED
  489. #define REFIID              const IID FAR* const
  490. #endif
  491. #ifndef _REFCLSID_DEFINED
  492. #define _REFCLSID_DEFINED
  493. #define REFCLSID            const CLSID FAR* const
  494. #endif
  495. #endif
  496.  
  497.  
  498. //#ifdef INITGUID
  499. #include "Rcoguid.h"
  500. //#endif
  501.  
  502. /****** Other value types ***************************************************/
  503.  
  504. // memory context values; passed to CoGetMalloc
  505. typedef enum tagMEMCTX
  506. {
  507.     MEMCTX_TASK = 1,            // task (private) memory
  508.     MEMCTX_SHARED = 2,          // shared memory (between processes)
  509. #ifdef _MAC
  510.     MEMCTX_MACSYSTEM = 3,       // on the mac, the system heap
  511. #endif 
  512.  
  513.     // these are mostly for internal use...
  514.     MEMCTX_UNKNOWN = -1,        // unknown context (when asked about it)
  515.     MEMCTX_SAME = -2           // same context (as some other pointer)
  516. } MEMCTX;
  517.  
  518.  
  519.  
  520. // class context: used to determine what scope and kind of class object to use
  521. // NOTE: this is a bitwise enum
  522. typedef enum tagCLSCTX
  523. {
  524.     CLSCTX_INPROC_SERVER = 1,   // server dll (runs in same process as caller)
  525.     CLSCTX_INPROC_HANDLER = 2,  // handler dll (runs in same process as caller)
  526.     CLSCTX_LOCAL_SERVER = 4     // server exe (runs on same machine; diff proc)
  527. } CLSCTX;
  528.  
  529. #define CLSCTX_ALL              (CLSCTX_INPROC_SERVER| \
  530.                                  CLSCTX_INPROC_HANDLER| \
  531.                                  CLSCTX_LOCAL_SERVER)
  532.  
  533. #define CLSCTX_INPROC           (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER)
  534.  
  535. #define CLSCTX_SERVER           (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER)
  536.  
  537.  
  538. // class registration flags; passed to CoRegisterClassObject
  539. typedef enum tagREGCLS
  540. {
  541.     REGCLS_SINGLEUSE = 0,       // class object only generates one instance
  542.     REGCLS_MULTIPLEUSE = 1,     // same class object genereates multiple inst.
  543.                                 // and local automatically goes into inproc tbl.
  544.     REGCLS_MULTI_SEPARATE = 2  // multiple use, but separate control over each
  545.                                 // context.
  546.  
  547.     // NOTE: CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE is the same as
  548.     // (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER), REGCLS_MULTI_SEPARATE, but
  549.     // not the same as CLSCTX_LOCAL_SERVER, REGCLS_MULTI_SEPARATE.
  550. } REGCLS;
  551.  
  552.  
  553. // interface marshaling definitions
  554. #define MARSHALINTERFACE_MIN 40 // minimum number of bytes for interface marshl
  555.  
  556. // marshaling flags; passed to CoMarshalInterface
  557. typedef enum tagMSHLFLAGS
  558. {
  559.     MSHLFLAGS_NORMAL = 0,       // normal marshaling via proxy/stub
  560.     MSHLFLAGS_TABLESTRONG = 1,  // keep object alive; must explicitly release
  561.     MSHLFLAGS_TABLEWEAK = 2     // doesn't hold object alive; still must release
  562. } MSHLFLAGS;
  563.  
  564. // marshal context: determines the destination context of the marshal operation
  565. typedef enum tagMSHCTX
  566. {
  567.     MSHCTX_LOCAL = 0,           // unmarshal context is local (eg.shared memory)
  568.     MSHCTX_NOSHAREDMEM = 1     // unmarshal context has no shared memory access
  569. } MSHCTX;
  570.  
  571.  
  572. // call type used by IMessageFilter::HandleIncommingMessage
  573. typedef enum tagCALLTYPE
  574. {
  575.     CALLTYPE_TOPLEVEL = 1,      // toplevel call - no outgoing call 
  576.     CALLTYPE_NESTED   = 2,      // callback on behalf of previous outgoing call - should always handle
  577.     CALLTYPE_ASYNC    = 3,      // aysnchronous call - can NOT be rejected
  578.     CALLTYPE_TOPLEVEL_CALLPENDING = 4,  // new toplevel call with new LID
  579.     CALLTYPE_ASYNC_CALLPENDING    = 5   // async call - can NOT be rejected
  580. } CALLTYPE;
  581.  
  582. typedef struct tagINTERFACEINFO 
  583. {               
  584.     interface IUnknown FAR *pUnk;       // the pointer to the object
  585.     IID                  iid;            // interface id
  586.     WORD                wMethod;        // interface methode
  587. } INTERFACEINFO, FAR * LPINTERFACEINFO;
  588.  
  589. // status of server call - returned by IMessageFilter::HandleIncommingCall
  590. // and passed to  IMessageFilter::RetryRejectedCall
  591. typedef enum tagSERVERCALL
  592. {
  593.     SERVERCALL_ISHANDLED    = 0,
  594.     SERVERCALL_REJECTED     = 1,
  595.     SERVERCALL_RETRYLATER   = 2         
  596. } SERVERCALL;
  597.  
  598.  
  599. // Pending type indicates the level of nesting
  600. typedef enum tagPENDINGTYPE
  601. {   
  602.     PENDINGTYPE_TOPLEVEL = 1,       // toplevel call
  603.     PENDINGTYPE_NESTED   = 2       // nested call
  604. } PENDINGTYPE;
  605.  
  606. // return values of MessagePending
  607. typedef enum tagPENDINGMSG
  608. {   
  609.     PENDINGMSG_CANCELCALL  = 0, // cancel the outgoing call
  610.     PENDINGMSG_WAITNOPROCESS  = 1, // wait for the return and don't dispatch the message
  611.     PENDINGMSG_WAITDEFPROCESS = 2  // wait and dispatch the message 
  612.     
  613. } PENDINGMSG;
  614.  
  615.  
  616. // bit flags for IExternalConnection
  617. typedef enum tagEXTCONN 
  618. {
  619.     EXTCONN_STRONG        = 0x0001    // strong connection
  620. } EXTCONN;
  621.  
  622.  
  623. /****** IUnknown Interface **************************************************/
  624.  
  625.  
  626. #undef  INTERFACE
  627. #define INTERFACE   IUnknown
  628.  
  629. #if defined(_MAC) && (defined(_MSC_VER) || !defined(__cplusplus)) && !defined(qEmulateSingleObject)
  630. #define qEmulateSingleObject
  631. #endif
  632.  
  633. #if defined(qEmulateSingleObject)
  634. //On the Mac it is very important to get the v-table in the following format
  635. //        NULL
  636. //        NULL  //as of 5.0
  637. //        &fn1
  638. //        &fn2
  639. //        &fn3
  640. //        ...
  641. //which is the format agreed for SingleObject in Metrowerks and Apple CFront
  642. //In case a compiler uses this format by default, just don't do anything.
  643. //In case a compiler doesn't add a NULL entry, define EMULATE_SINGLEOBJECT.
  644. //In case a compiler as entry larger than 4 bytes, it WON'T work.
  645.  
  646. #ifndef SINGLEOBJECT
  647. DECLARE_INTERFACE(SingleObject)
  648. {
  649.     STDMETHOD(PADMETHOD1) (THIS) {return 0;}
  650.     STDMETHOD(PADMETHOD2) (THIS) {return 0;}
  651. };
  652. #define SINGLEOBJECT SingleObject
  653. #endif
  654. DECLARE_INTERFACE_(IUnknown, SingleObject)
  655. #else
  656. DECLARE_INTERFACE(IUnknown)
  657. #endif
  658. {
  659.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  660.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  661.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  662. };
  663.  
  664. typedef        IUnknown FAR* LPUNKNOWN;
  665.  
  666.  
  667. /****** Class Factory Interface *******************************************/
  668.  
  669.  
  670. #undef  INTERFACE
  671. #define INTERFACE   IClassFactory
  672.  
  673. DECLARE_INTERFACE_(IClassFactory, IUnknown)
  674. {
  675.     // *** IUnknown methods ***
  676.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  677.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  678.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  679.  
  680.     // *** IClassFactory methods ***
  681.     STDMETHOD(CreateInstance) (THIS_ LPUNKNOWN pUnkOuter,
  682.                               REFIID riid,
  683.                               LPVOID FAR* ppvObject) PURE;
  684.     STDMETHOD(LockServer) (THIS_ BOOL fLock) PURE;
  685.  
  686. };
  687. typedef       IClassFactory FAR* LPCLASSFACTORY;
  688.  
  689.  
  690. /****** Memory Allocation Interface ***************************************/
  691.  
  692.  
  693. #undef  INTERFACE
  694. #define INTERFACE   IMalloc
  695.  
  696. DECLARE_INTERFACE_(IMalloc, IUnknown)
  697. {
  698.     // *** IUnknown methods ***
  699.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  700.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  701.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  702.  
  703.     // *** IMalloc methods ***
  704.     STDMETHOD_(void FAR*, Alloc) (THIS_ ULONG cb) PURE;
  705.     STDMETHOD_(void FAR*, Realloc) (THIS_ void FAR* pv, ULONG cb) PURE;
  706.     STDMETHOD_(void, Free) (THIS_ void FAR* pv) PURE;
  707.     STDMETHOD_(ULONG, GetSize) (THIS_ void FAR* pv) PURE;
  708.     STDMETHOD_(int, DidAlloc) (THIS_ void FAR* pv) PURE;
  709.     STDMETHOD_(void, HeapMinimize) (THIS) PURE;
  710. };
  711. typedef       IMalloc FAR* LPMALLOC;
  712.  
  713.  
  714. /****** IMarshal Interface ************************************************/
  715.  
  716. // forward declaration for IStream; must include storage.h later to use
  717. #ifdef __cplusplus
  718. interface IStream;
  719. #else
  720. typedef interface IStream IStream;
  721. #endif
  722. typedef         IStream FAR* LPSTREAM;
  723.  
  724.  
  725. #undef  INTERFACE
  726. #define INTERFACE   IMarshal
  727.  
  728. DECLARE_INTERFACE_(IMarshal, IUnknown)
  729. {
  730.     // *** IUnknown methods ***
  731.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  732.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  733.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  734.  
  735.     // *** IMarshal methods ***
  736.     STDMETHOD(GetUnmarshalClass)(THIS_ REFIID riid, LPVOID pv, 
  737.                         DWORD dwDestContext, LPVOID pvDestContext,
  738.                         DWORD mshlflags, LPCLSID pCid) PURE;
  739.     STDMETHOD(GetMarshalSizeMax)(THIS_ REFIID riid, LPVOID pv, 
  740.                         DWORD dwDestContext, LPVOID pvDestContext,
  741.                         DWORD mshlflags, LPDWORD pSize) PURE;
  742.     STDMETHOD(MarshalInterface)(THIS_ LPSTREAM pStm, REFIID riid,
  743.                         LPVOID pv, DWORD dwDestContext, LPVOID pvDestContext,
  744.                         DWORD mshlflags) PURE;
  745.     STDMETHOD(UnmarshalInterface)(THIS_ LPSTREAM pStm, REFIID riid,
  746.                         LPVOID FAR* ppv) PURE;
  747.     STDMETHOD(ReleaseMarshalData)(THIS_ LPSTREAM pStm) PURE;
  748.     STDMETHOD(DisconnectObject)(THIS_ DWORD dwReserved) PURE;
  749. };
  750. typedef         IMarshal FAR* LPMARSHAL;
  751.  
  752.  
  753. #undef  INTERFACE
  754. #define INTERFACE   IStdMarshalInfo
  755.  
  756. DECLARE_INTERFACE_(IStdMarshalInfo, IUnknown)
  757. {
  758.     // *** IUnknown methods ***
  759.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  760.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  761.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  762.  
  763.     // *** IStdMarshalInfo methods ***
  764.     STDMETHOD(GetClassForHandler)(THIS_ DWORD dwDestContext, 
  765.                         LPVOID pvDestContext, LPCLSID pClsid) PURE;
  766. };
  767. typedef         IStdMarshalInfo FAR* LPSTDMARSHALINFO;
  768.  
  769.  
  770. /****** Message Filter Interface *******************************************/
  771.  
  772.  
  773. #undef  INTERFACE
  774. #define INTERFACE   IMessageFilter
  775.  
  776. DECLARE_INTERFACE_(IMessageFilter, IUnknown)
  777. {
  778.     // *** IUnknown methods ***
  779.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  780.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  781.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  782.  
  783.     // *** IMessageFilter methods ***
  784.     STDMETHOD_(DWORD, HandleInComingCall) (THIS_ DWORD dwCallType,
  785.                                 HTASK htaskCaller, DWORD dwTickCount,
  786.                                 DWORD dwReserved ) PURE;
  787.     STDMETHOD_(DWORD, RetryRejectedCall) (THIS_ 
  788.                                 HTASK htaskCallee, DWORD dwTickCount,
  789.                                 DWORD dwRejectType ) PURE;
  790.     STDMETHOD_(DWORD, MessagePending) (THIS_ 
  791.                                 HTASK htaskCallee, DWORD dwTickCount, 
  792.                                 DWORD dwPendingType  ) PURE; 
  793. };
  794. typedef       IMessageFilter FAR* LPMESSAGEFILTER;
  795.  
  796.  
  797. /****** External Connection Information ***********************************/
  798.  
  799. #undef  INTERFACE
  800. #define INTERFACE   IExternalConnection
  801.  
  802. DECLARE_INTERFACE_(IExternalConnection, IUnknown)
  803. {
  804.     // *** IUnknown methods ***
  805.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  806.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  807.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  808.  
  809.     // *** IExternalConnection methods ***
  810.     STDMETHOD_(DWORD, AddConnection) (THIS_ DWORD extconn, DWORD reserved) PURE;
  811.     STDMETHOD_(DWORD, ReleaseConnection) (THIS_ DWORD extconn, DWORD reserved, BOOL fLastReleaseCloses) PURE;
  812. };
  813. typedef       IExternalConnection FAR* LPEXTERNALCONNECTION;
  814.  
  815.  
  816. /****** Enumerator Interfaces *********************************************/
  817.  
  818. /*
  819.  *  Since we don't use parametrized types, we put in explicit declarations
  820.  *  of the enumerators we need.
  821.  */
  822.  
  823.  
  824. #undef  INTERFACE
  825. #define INTERFACE   IEnumString
  826.  
  827. DECLARE_INTERFACE_(IEnumString, IUnknown)
  828. {
  829.     // *** IUnknown methods ***
  830.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  831.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  832.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  833.  
  834.     // *** IEnumString methods ***
  835.     STDMETHOD(Next) (THIS_ ULONG celt, 
  836.                        LPSTR FAR* rgelt, 
  837.                        ULONG FAR* pceltFetched) PURE;
  838.     STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
  839.     STDMETHOD(Reset) (THIS) PURE;
  840.     STDMETHOD(Clone) (THIS_ IEnumString FAR* FAR* ppenm) PURE;
  841. };
  842. typedef      IEnumString FAR* LPENUMSTRING;
  843.  
  844.  
  845. #undef  INTERFACE
  846. #define INTERFACE   IEnumUnknown
  847.  
  848. DECLARE_INTERFACE_(IEnumUnknown, IUnknown)
  849. {
  850.     // *** IUnknown methods ***
  851.     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE;
  852.     STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
  853.     STDMETHOD_(ULONG,Release) (THIS) PURE;
  854.  
  855.     // *** IEnumUnknown methods ***
  856.     STDMETHOD(Next) (THIS_ ULONG celt, LPUNKNOWN FAR* rgelt, ULONG FAR* pceltFetched) PURE;
  857.     STDMETHOD(Skip) (THIS_ ULONG celt) PURE;
  858.     STDMETHOD(Reset) (THIS) PURE;
  859.     STDMETHOD(Clone) (THIS_ IEnumUnknown FAR* FAR* ppenm) PURE;
  860. };
  861. typedef         IEnumUnknown FAR* LPENUMUNKNOWN;
  862.  
  863.  
  864. /****** STD Object API Prototypes *****************************************/
  865.  
  866. STDAPI_(DWORD) CoBuildVersion( VOID );
  867.  
  868. /* init/uninit */
  869.  
  870. STDAPI  CoInitialize(LPMALLOC pMalloc);
  871. STDAPI_(void)  CoUninitialize(void);
  872. STDAPI  CoGetMalloc(DWORD dwMemContext, LPMALLOC FAR* ppMalloc);
  873. STDAPI_(DWORD) CoGetCurrentProcess(void);
  874. STDAPI  CoCreateStandardMalloc(DWORD memctx, IMalloc FAR* FAR* ppMalloc);
  875.  
  876.  
  877. /* register/revoke/get class objects */
  878.  
  879. STDAPI  CoGetClassObject(REFCLSID rclsid, DWORD dwClsContext, LPVOID pvReserved,
  880.                     REFIID riid, LPVOID FAR* ppv);
  881. STDAPI  CoRegisterClassObject(REFCLSID rclsid, LPUNKNOWN pUnk,
  882.                     DWORD dwClsContext, DWORD flags, LPDWORD lpdwRegister);
  883. STDAPI  CoRevokeClassObject(DWORD dwRegister);
  884.  
  885.  
  886. /* marshaling interface pointers */
  887.  
  888. STDAPI CoMarshalInterface(LPSTREAM pStm, REFIID riid, LPUNKNOWN pUnk,
  889.                     DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags);
  890. STDAPI CoUnmarshalInterface(LPSTREAM pStm, REFIID riid, LPVOID FAR* ppv);
  891. STDAPI CoMarshalHresult(LPSTREAM pstm, HRESULT hresult);
  892. STDAPI CoUnmarshalHresult(LPSTREAM pstm, HRESULT FAR * phresult);
  893. STDAPI CoReleaseMarshalData(LPSTREAM pStm);
  894. STDAPI CoDisconnectObject(LPUNKNOWN pUnk, DWORD dwReserved);
  895. STDAPI CoLockObjectExternal(LPUNKNOWN pUnk, BOOL fLock, BOOL fLastUnlockReleases);
  896. STDAPI CoGetStandardMarshal(REFIID riid, LPUNKNOWN pUnk, 
  897.                     DWORD dwDestContext, LPVOID pvDestContext, DWORD mshlflags,
  898.                     LPMARSHAL FAR* ppMarshal);
  899.  
  900. STDAPI_(BOOL) CoIsHandlerConnected(LPUNKNOWN pUnk);
  901.  
  902. /* dll loading helpers; keeps track of ref counts and unloads all on exit */
  903.  
  904. STDAPI_(HINSTANCE) CoLoadLibrary(LPSTR lpszLibName, BOOL bAutoFree);
  905. STDAPI_(void) CoFreeLibrary(HINSTANCE hInst);
  906. STDAPI_(void) CoFreeAllLibraries(void);
  907. STDAPI_(void) CoFreeUnusedLibraries(void);
  908.  
  909.  
  910. /* helper for creating instances */
  911.  
  912. STDAPI CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter,
  913.                     DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv);
  914.  
  915.  
  916. /* other helpers */
  917. #ifdef __cplusplus
  918. inline BOOL  InlineIsEqualGUID(REFGUID rguid1, REFGUID rguid2)
  919. {
  920.    return (
  921.       ((PLONG) &rguid1)[0] == ((PLONG) &rguid2)[0] &&
  922.       ((PLONG) &rguid1)[1] == ((PLONG) &rguid2)[1] &&
  923.       ((PLONG) &rguid1)[2] == ((PLONG) &rguid2)[2] &&
  924.       ((PLONG) &rguid1)[3] == ((PLONG) &rguid2)[3]);
  925. }
  926. #else   // ! __cplusplus
  927. #define InlineIsEqualGUID(rguid1, rguid2)  \
  928.         (((PLONG) rguid1)[0] == ((PLONG) rguid2)[0] &&   \
  929.         ((PLONG) rguid1)[1] == ((PLONG) rguid2)[1] &&    \
  930.         ((PLONG) rguid1)[2] == ((PLONG) rguid2)[2] &&    \
  931.         ((PLONG) rguid1)[3] == ((PLONG) rguid2)[3])
  932. #endif  // __cplusplus
  933.  
  934.  
  935. #define IsEqualGUID(rguid1, rguid2) InlineIsEqualGUID(rguid1, rguid2)
  936.  
  937. #if 0
  938. STDAPI_(BOOL) IsEqualGUID(REFGUID rguid1, REFGUID rguid2);
  939. STDAPI StringFromCLSID(REFCLSID rclsid, LPSTR FAR* lplpsz);
  940. STDAPI CLSIDFromString(LPSTR lpsz, LPCLSID pclsid);
  941. STDAPI StringFromIID(REFIID rclsid, LPSTR FAR* lplpsz);
  942. STDAPI IIDFromString(LPSTR lpsz, LPIID lpiid);
  943. STDAPI_(BOOL) CoIsOle1Class(REFCLSID rclsid);
  944. STDAPI ProgIDFromCLSID (REFCLSID clsid, LPSTR FAR* lplpszProgID);
  945. STDAPI CLSIDFromProgID (LPCSTR lpszProgID, LPCLSID lpclsid);
  946. STDAPI_(int) StringFromGUID2(REFGUID rguid, LPSTR lpsz, int cbMax);
  947. #endif
  948.  
  949. STDAPI CoCreateGuid(GUID FAR *pguid);
  950.  
  951. STDAPI_(BOOL) CoFileTimeToDosDateTime(
  952.                  FILETIME FAR* lpFileTime, LPWORD lpDosDate, LPWORD lpDosTime);
  953. STDAPI_(BOOL) CoDosDateTimeToFileTime(
  954.                        WORD nDosDate, WORD nDosTime, FILETIME FAR* lpFileTime);
  955. STDAPI  CoFileTimeNow( FILETIME FAR* lpFileTime );
  956.  
  957.  
  958. STDAPI CoRegisterMessageFilter( LPMESSAGEFILTER lpMessageFilter,
  959.                                 LPMESSAGEFILTER FAR* lplpMessageFilter );
  960.  
  961.  
  962. /* TreatAs APIS */
  963.  
  964. STDAPI CoGetTreatAsClass(REFCLSID clsidOld, LPCLSID pClsidNew);
  965. STDAPI CoTreatAsClass(REFCLSID clsidOld, REFCLSID clsidNew);
  966.  
  967.  
  968. /* the server dlls must define their DllGetClassObject and DllCanUnloadNow
  969.  * to match these; the typedefs are located here to ensure all are changed at 
  970.  * the same time.
  971.  */
  972.  
  973. STDAPI  DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID FAR* ppv);
  974. #if 0
  975. typedef STDAPICALLTYPE HRESULT (FAR* LPFNGETCLASSOBJECT) (REFCLSID, REFIID, LPVOID FAR*);
  976. #else
  977. typedef HRESULT (STDAPICALLTYPE FAR* LPFNGETCLASSOBJECT) (REFCLSID, REFIID, LPVOID FAR*);
  978. #endif
  979.  
  980.  
  981. STDAPI  DllCanUnloadNow(void);
  982. #if 0
  983. typedef STDAPICALLTYPE HRESULT (FAR* LPFNCANUNLOADNOW)(void);
  984. #else
  985. typedef HRESULT (STDAPICALLTYPE FAR* LPFNCANUNLOADNOW)(void);
  986. #endif
  987.  
  988.  
  989. /****** Debugging Helpers *************************************************/
  990.  
  991. #ifdef _DEBUG
  992. // writes to the debug port and displays a message box
  993. STDAPI FnAssert(LPSTR lpstrExpr, LPSTR lpstrMsg, LPSTR lpstrFileName, UINT iLine);
  994. #endif  //  _DEBUG
  995.  
  996. #endif // _COMPOBJ_H_
  997.  
  998. #endif